package com.ffox.controller;

import com.ffox.entity.GroupChatFile;
import com.ffox.entity.GroupChatMessage;
import com.ffox.entity.GroupChatNotification;
import com.ffox.service.UserGroupchatService;
import com.ffox.service.dto.MemberDto;
import com.ffox.service.dto.MessageDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.awt.*;
import java.util.List;

/**
 * 群聊相关功能的控制器类，用于处理群聊消息、文件、通知等操作。
 */
@RestController
@RequestMapping("/userGroupChat")
public class UserGroupchatController {

    @Autowired
    private UserGroupchatService userGroupchatService;

    /**
     * 发送群聊消息。
     *
     * @param message 群聊消息对象，包含消息内容、发送者、时间等信息
     * @return 返回发送结果的状态码
     */
    @MessageMapping("/groupChat.sendMessage.{classId}")
    @SendTo("/topic/class.{classId}")
    public MessageDto sendMessage( @DestinationVariable("classId") String classId,GroupChatMessage message){

        return userGroupchatService.sendMessage(message);
    }

    /**
     * 删除指定ID的群聊消息。
     *
     * @param messageId 要删除的消息ID
     * @return 返回删除操作的结果状态码
     */
    @PostMapping("/deleteMessage")
    public Integer deleteMessage(@RequestParam Long messageId){
        return userGroupchatService.deleteMessage(messageId);
    }

    /**
     * 获取指定班级ID的群聊消息列表。
     *
     * @param classId 班级ID
     * @return 返回该班级下的所有群聊消息列表
     */
    @PostMapping("/getMessages")
    public List<MessageDto> getMessages(@RequestParam Long classId){
        return userGroupchatService.getMessages(classId);
    }

    /**
     * 上传群聊文件。
     *
     * 群聊文件信息对象
     * @param files 实际上传的文件数据
     * @return 返回上传操作的结果状态码
     */
    @PostMapping(value = "/uploadFile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Integer uploadFile(@RequestParam Long classId,@RequestParam String userNum, @RequestPart MultipartFile files){
        return userGroupchatService.uploadFile(classId, userNum , files);
    }

    /**
     * 删除指定ID的群聊文件。
     *
     * @param fileId 要删除的文件ID
     * @return 返回删除操作的结果状态码
     */
    @PostMapping("/deleteFile")
    public Integer deleteFile(@RequestParam Long fileId){
        return userGroupchatService.deleteFile(fileId);
    }

    /**
     * 获取指定班级ID的群聊文件列表。
     *
     * @param classId 班级ID
     * @return 返回该班级下的所有群聊文件列表
     */
    @PostMapping("/getFiles")
    public List<GroupChatFile> getFiles(@RequestParam Long classId){
        return userGroupchatService.getFiles(classId);
    }

    /**
     * 创建一个新的群聊通知。
     *
     * @param notification 群聊通知对象，包含通知内容、创建者等信息
     * @return 返回创建操作的结果状态码
     */
    @PostMapping("/createNotification")
    public Integer createNotification(@RequestBody GroupChatNotification notification){
        System.out.println("notification"+notification);
        return userGroupchatService.createNotification(notification);
    }

    /**
     * 删除指定ID的群聊通知。
     *
     * @param notificationId 要删除的通知ID
     * @return 返回删除操作的结果状态码
     */
    @PostMapping("/deleteNotification")
    public Integer deleteNotification(@RequestParam Long notificationId){
        return userGroupchatService.deleteNotification(notificationId);
    }

    /**
     * 获取指定班级ID的群聊通知列表。
     *
     * @param classId 班级ID
     * @return 返回该班级下的所有群聊通知列表
     */
    @PostMapping("/getNotifications")
    public List<GroupChatNotification> getNotifications(@RequestParam Long classId){
        return userGroupchatService.getNotifications(classId);
    }

    /**
     * 标记指定通知为已读，并更新阅读次数。
     *
     * @param notificationId 要标记的通知ID
     * @return 返回标记操作的结果状态码
     */
    @PostMapping("/markNotificationReadCount")
    public Integer markNotificationReadCount(@RequestParam Long notificationId){
        return userGroupchatService.markNotificationReadCount(notificationId);
    }

    /**
     * 更新指定通知的置顶状态。
     *
     * @param notificationId 要更新的通知ID
     * @return 返回更新操作的结果状态码
     */
    @PostMapping("/updateNotificationIsPinned")
    public Integer updateNotificationIsPinned(@RequestParam Long notificationId,@RequestParam Byte isPinned){
        return userGroupchatService.updateNotificationIsPinned(notificationId, isPinned);
    }

    @PostMapping("/getClassMembers")
    public List<MemberDto> getClassMembers(@RequestParam Long classId){
        return userGroupchatService.getClassMembers(classId);
    }

}
